数据抽样
目标:从tb中随机抽样m条(占比为r)数据
粗暴抽样
代码
--1. 利用order by
select * from tb
order by rand()
limit m;
--2. 利用sort by
select * from tb
distribute by rand()
sort by rand()
limit m;
逻辑:通过rand()函数将数据随机打散,利用distribute函数,将数据随机分配到不同mapper和reducer,然后对不同的mapper、reducer下的数据进行sort排序,获取到rand的数据~~;order by的方式不会拆分mapper、reducer,而只是通过全局排序进行处理,效率相对distribute会慢很多
数据块抽样
代码
select * from tb
tablesample(r percent) s;
--按照行数进行抽样,限制的行数为每个mapper中获取的样本数,显示为所有mapper的总行数
select * from tb
tablesample(mi rows) s;
桶表抽样
select * from tb
tablesample(bucket 3 out of 32 on rand()) s;
前提:tb为一张桶表
逻辑:建桶表时会确定建了N个桶,N/32决定每个桶有多少个簇,而3代表第三个桶,第三个桶是由第3、3+32 ... 个簇组合而成,这样在抽样时无需扫描整个表,从而加快效率~~